package model

import (
	"errors"
	"time"

	"github.com/robfig/cron/v3"
)

// Task 定义任务模型
type Task struct {
	ID          uint      `json:"id" gorm:"primaryKey"`
	Name        string    `json:"name" gorm:"not null"`
	GroupName   string    `json:"group_name" gorm:"not null;default:'default'"`
	Command     string    `json:"command" gorm:"not null"`
	CronExpr    string    `json:"cron_expr" gorm:"not null"`
	Description string    `json:"description"`
	Status      int       `json:"status" gorm:"not null;default:1"` // 1:启用 2:禁用
	LastRunTime time.Time `json:"last_run_time"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

// GetStatusText 获取任务状态的文本描述
func (t *Task) GetStatusText() string {
	switch t.Status {
	case 1:
		return "启用"
	case 2:
		return "禁用"
	default:
		return "未知"
	}
}

// Validate 验证任务数据
func (t *Task) Validate() error {
	if t.Name == "" {
		return errors.New("任务名称不能为空")
	}
	if t.Command == "" {
		return errors.New("执行命令不能为空")
	}
	if t.CronExpr == "" {
		return errors.New("Cron表达式不能为空")
	}

	// 验证Cron表达式
	parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
	_, err := parser.Parse(t.CronExpr)
	if err != nil {
		return errors.New("无效的Cron表达式")
	}

	return nil
}

// NextRunTime 计算下次运行时间
func (t *Task) NextRunTime(from time.Time) (time.Time, error) {
	parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
	schedule, err := parser.Parse(t.CronExpr)
	if err != nil {
		return time.Time{}, err
	}
	return schedule.Next(from), nil
}

// IsEnabled 判断任务是否启用
func (t *Task) IsEnabled() bool {
	return t.Status == 1
}
